package com.myacg.core.move;

import com.myacg.core.entity.Point;
import com.myacg.core.utils.MoveUtils;

/**
 * 圆周运动插件
 * @author Administrator
 *
 */
public class CircularMovePlugin implements MovePlugin{
	protected Point point; // 控件的坐标
	protected double v; // 当前速度
	protected double v0;//初速度
	protected double m;// 重量
	protected double F; // 在方向上的作用力
	protected Point startPoint; // 起始坐标
	protected double direction;// 方向 斜率 与水平x轴的斜率值
	protected double oldDir; // 历史方向
	protected double t; // 时间常量
	protected double S; // 位移
	protected double olda; //历史加速度
	
	protected int angle;//角度
	public CircularMovePlugin(Point point){
		this.point=point;
		startPoint=point;
		v=v0=0;
	    m=5;
	    olda=0;
	}
	
	
	/**
	 * 普通的直线行走函数
	 */
	public void runToMove(){
			//加速度
			double a = F/m;
			//如果加速度发生变化或者运动方向发生变化 则重置计算位移函数
			if(olda!=a){
				//startPoint.x=point.x;
				//startPoint.y=point.y;
				v0=v;
				t=0;
			}
			
			
			//如果速度和加速度都不为0 则累计时间变量
			if(a<=0&&v<=0){
				t=0;
				v=0;
			}else{
				t+=1;
			}
			
			//根据初速度和加速度计算偏移量
			//S=MoveUtils.getNextS(v0, a, t);
			if(S==0){
				S=MoveUtils.getRangle(point, startPoint);//两点间距离为定值
				System.out.println(S);
			}
			//计算当前速度  --作为角度的增量
			v = v0+a*t;
			//System.out.println("S: "+S+" a:"+a+" F:"+F+" v: "+v+" v0:"+v0+" t: "+t);
			if(v>0){
		     angle+=v;
		     //将角度换算为弧度
			 direction=Math.toRadians(angle%360); 
			//根据偏移量和倾斜角计算x，y的新坐标 
			 Point p = MoveUtils.getNextOvalPoint(S, direction, startPoint); 
			 point.x=p.x;
			 point.y=p.y;
			}
			//记录当前状态方向
			oldDir=direction;
			olda=a;
	}
	
	
	/**
	 * 获取位移的长度
	 * @return
	 */
	public double getMoveLength(){
		return S;
	}
	/**
	 * 设置力度
	 * @param F
	 */
	public void setF(double F){
		this.F=F;
	}
	/**
	 * 设置方向
	 * @param direction
	 */
	public void setDirection(double direction){
		this.direction=direction;
	}
	
	
	/**
	 * 获取方向上的力度
	 * @return
	 */
	public double getF() {
		return F;
	}
	/**
	 * 获取方向
	 * @return
	 */
	public double getDirection() {
		return direction;
	}
	/**
	 * 获取当前点
	 * @return
	 */
    public Point getPoint(){
    	return this.point;
    }

    /**
     * 方向发生改变时
     */
	@Override
	public boolean isChangeDir() {
		return oldDir!=direction;
	}

	/**
	 * 重设状态
	 */
	@Override
	public void resetState() {
		//startPoint.x=point.x;
		//startPoint.y=point.y;
		v0=v=0;
		t=0;
		S=0;
	}

	public void setV0(double v0) {
		this.v0 = v0;
	}

    /**
     * 获取当前的速度
     */
	@Override
	public double getV() {
		return this.v;
	}
	
	@Override
	public double getV0() {
		return this.v0;
	}


	@Override
	public void setStartPoint(Point point) {
		this.startPoint=point;
	}
	
	
}
